const store = {
    state: {
        /**
         * 页面栈数据
         *
         * Map<key:string, data:object>
         *
         * data --
         *       |- param 普通参数，更新时首层合并
         *       |- onceValue 由当前页面向下一页面传入该参数，下一页面离开时会清除该值，更新时替换
         *       |- fixedValue 由当前页面向下一页面传入该参数，下一页面返回时会直接自动返回该值（当前页面取该值），更新时替换
         *       |- nextFixedValue 由当前页面向下一页面传入该参数，下一页面返回时会直接自动返回该值（下一页面取该值），更新时替换
         */
        pageStack: new Map(),

        /**
         * 页面栈数
         *
         * 通过 meta.isInitRefer 标识，是否以该路由为“首页”
         */
        pageStackLen: null,
        pageStackReferNum: 1,

        backData: null, // 回退路由时数据（结构与 pageStack value 一样）

        pathData: null, // 使用 path 跳转时的数据（结构与 pageStack value 一样）

        isBack: false // 是否回退路由
    },

    /**
     * 初始化页面栈数
     */
    initPageStackLen () {
        this.state.pageStackLen = this.state.pageStackReferNum;
    },

    /**
     * 当前页面是否是“首页”
     */
    isReferPage () {
        return this.state.pageStackLen <= this.state.pageStackReferNum;
    },

    /**
     * 更新页面栈数
     */
    addPageStackLen (addNum = 1) {
        this.state.pageStackLen += addNum;
    },
    delPageStackLen (delNum = 1) {
        this.state.pageStackLen -= delNum;
    },

    /**
     * 清除页面数据
     */
    removePageData (navKey) {
        this.state.pageStack.delete(navKey);
    },

    /**
     * 获取页面数据
     */
    getPageData (navKey) {
        const pageStack = this.state.pageStack;
        return pageStack.get(navKey);
    },

    /**
     * 保存页面数据
     */
    savePageData (navKey, routeParams, config) {
        const defaultConfig = { needProcessData: true };
        config = Object.assign(Object.create(null), defaultConfig, config); // 合并配置项

        const pageStack = this.state.pageStack;

        if (config.needProcessData) {
            pageStack.set(navKey, this.processData(routeParams, pageStack.get(navKey)?.param));
            return;
        }

        if (!config.needProcessData) pageStack.set(navKey, routeParams);
    },

    /**
     * 保存回退路由数据
     */
    saveBackPageData (navKey) {
        this.savePageData(navKey, this.state.backData, { needProcessData: false });
    },

    /**
     * 更新回退路由数据
     */
    changeBackData (routeParams) {
        this.state.backData = this.processData(routeParams, this.state.backData?.param);
    },

    /**
     * 清除回退路由参数
     */
    clearBackData () {
        this.state.backData = null;
    },

    /**
     * 保存 path 跳转页面数据
     */
    savePathPageData (navKey) {
        this.savePageData(navKey, this.state.pathData, { needProcessData: false });
    },

    /**
     * 更新 path 跳转参数
     */
    changePathData (routeParams, config) {
        const defaultConfig = { needProcessData: true };
        config = Object.assign(Object.create(null), defaultConfig, config); // 合并配置项

        if (config.needProcessData) {
            this.state.pathData = this.processData(routeParams);
            return;
        }

        if (!config.needProcessData) {
            this.state.pathData = routeParams;
        }
    },

    /**
     * 清除 path 跳转参数
     */
    clearPathData () {
        this.state.pathData = null;
    },

    /**
     * 处理（拆分）数据
     *
     * 返回数据结构需要与 pageStack value 一样
     */
    processData (routeParams, mergedParam) {
        const onceValue = routeParams?.onceValue || null;
        const fixedValue = routeParams?.fixedValue || null;
        const nextFixedValue = routeParams?.nextFixedValue || null;

        delete routeParams?.onceValue;
        delete routeParams?.fixedValue;
        delete routeParams?.nextFixedValue;

        const param = Object.assign(Object.create(null), mergedParam, routeParams);

        return { param, onceValue, fixedValue, nextFixedValue };
    },

    /**
     * 更新 isBack 标识
     */
    changeBackFlag (flag) {
        this.state.isBack = flag;
    }
};

export default store;
